[初心者向け]Dataformを動かしてみた
データアナリティクス事業本部の根本です。案件でDataformを触る機会があり、面白いサービスだと感じたので記事にしてみました。
はじめに
DataformとはBigQueryに対してSQLを実行して、テーブル間の依存関係を保ちつつtableやviewを作成できる、データパイプラインツールです。
SQLでデータマートを作成する際に、多くの中間テーブルやRAWデータテーブルを参照する処理の場合、データパイプラインの管理が大変になりがちですがDataformを用いることで管理を効率化することができます。
この記事の対象者
- Dataformを動かしてみたいひと
前提条件
- Google Cloudのプロジェクトが作成されていること
- BigQuery, Dataform APIが有効になっていること
Dataformの基本構成要素
- リポジトリ:SQLXファイル、JavaScriptファイル、Dataform構成ファイル(メタデータ)の格納場所。gitと接続できます
- 開発ワークスペース:SQLXファイルやJavaScriptファイルなどの実装を画面上で行うことができます
- リリースとスケジュール:スケジュール実行設定などができます
- SETTINGS:サービスアカウントやGitとの接続など諸設定ができます
Dataformを初めて使う場合は、リポジトリ設定を行いそれから開発ワークスペース作成を行なって開発をします。
やってみた
それでは実際にDataformを動かしてみたいと思います。
Google Cloudの画面上部の検索バーに[Dataform]と入力して、検索結果からDataformのサービス画面へ遷移します。
リポジトリの作成を行います。
Dataformのサービス画面から[CREATE REPOSITORY]をクリックします。
リポジトリIDは適当な名前を設定し、リージョンはasia-northeast1
を設定しました。
サービスアカウントはDataformのデフォルトのサービスアカウントを指定しています。
入力したら、[作成]を押下します。
リポジトリが作成されると以下のような画面が出力されます。
[リポジトリに移動]ボタンを押下します。
作成されたリポジトリをクリックします。
[開発ワークスペースを作成]をクリックします。
[開発ワークスペースを作成]ダイアログが表示されるので適当な[ワークスペースID]を入力して[作成]を押下します。
ワークスペースが作成されると、以下のように画面に表示されるようになるのでワークスペース名をクリックします。
[ワークスペースを初期化]を押下します。押下すると、Dataformを動作させるのに必要な設定ファイルが作成されます。
以下のような状態になります。
フォルダ構成を簡単に説明します
1. definitions
:
- ここにSQLXファイルを配置し、データ変換やビューの作成、テーブルを定義します。
2. includes
:
- 複数のSQLXファイルで共通利用される関数や定数などを格納できます。
上記のフォルダ以外にメタデータを管理するための設定ファイルがいくつか作成されます。
dataform.json
というファイルだけ初期設定から少し修正します。
{ "defaultSchema": "test_dataform", "assertionSchema": "dataform_assertions", "warehouse": "bigquery", "defaultDatabase": "test-project", "defaultLocation": "asia-northeast1" }
dataform.json
は重要な設定ファイルで、BigQueryとの接続設定もここで定義することができます。
少し解説をします。
1. defaultSchema
: "test_dataform"
デフォルトのスキーマ名をtest_dataform
と指定しています。Dataformプロジェクト内で作成されるテーブルやビューは、基本的にここで指定したスキーマ(BigQueryのデータセット)に作成されます。作業対象のデータセットを入力します。
2. assertionSchema
: "dataform_assertions"
アサーション(データの整合性や品質を検証するためのチェック)用のスキーマ名をdataform_assertions
と指定しています。特に使用しないので初期設定値のままです。
3. warehouse
: "bigquery"
使用するDWHとしてBigQueryを指定しています。これにより、DataformはBigQuery固有のSQLや管理機能を利用する設定となります。
4. defaultDatabase
: "test-project"
warehouse:bigquery
と指定している場合はこちらはGoogle Cloudのプロジェクト名
となります。
5. defaultLocation
: "asia-northeast1"
リージョンasia-northeast1
(東京リージョン)を指定しています。これにより、Dataformのデータ保存や処理がこのリージョン内で行われます。
続いて、Dataformのサービスアカウントに権限付与を行います。
IAMのアクセス権を付与の画面から、Dataformのサービスアカウントに以下の3つのロールを割り当てます。
[BigQuery ジョブユーザー]
[BigQuery データ編集者]
[BigQuery データ閲覧者]
Dataformに設定しているサービスアカウント名は[SETTINGS]>サービスアカウントの編集(鉛筆マーク)を押下すると確認できます!
[ワークスペースを初期化]を押下して、ワークスペースを初期化した場合definitionsフォルダ配下にサンプルのSQLXファイルが作成されています。
こちらを実行すると、dataform.jsonで指定したデータセットにViewが作成されます。試しに実行してみましょう。
画面上部の[実行を開始]>[全てのアクション]を押下してください。
実行確認画面表示されるので、画面下部の[実行を開始]ボタンを押下します。
BigQueryのエクスプローラで、dataform.jsonに設定したデータセットに[first_view]、[second_view]が作成されていたら動作成功です。
SQLXファイルの内容を簡単に触れておきます。
config { type: "view", // Creates a view in BigQuery. Try changing to "table" instead. columns: { test: "A description for the test column", // Column descriptions are pushed to BigQuery. } } SELECT 1 as test
このコードは、BigQuery内でViewを作成するための設定とSQLが含まれています。
SQLXは、Dataformが提供する拡張SQLで、SQLに追加の設定やメタデータを含めることができます。
以下は、このコードの各部分の説明です:
Config部分
type: "view"
: この設定は、SQLXを実行した結果作成されるオブジェクトの種類を指定しています。ここでは「view」を指定しています。「view」を指定した場合dataform.jsonに指定したデータセットにviewが作成されます。この設定を「table」に変更すると、tableが作成されます。columns
: このブロック内では、作成されるviewまたはtableの各カラムについての説明を設定できます。test
カラムにA description for the test column
という説明が設定されます。BigQueryのメタデータにプッシュされ、データカタログ等でカラムの説明として表示されることになります。
SQL部分
SELECT 1 as test
: このSQLは非常にシンプルで、常に1
という値を持つtest
というカラムを持つviewを作成します。実際の運用では、ELT処理のSQLをここに実装することでSQLを用いたデータ変換が可能となります。
config { type: "view" } SELECT test from ${ref("first_view")}
Config部分
first_view.sqlx
と同様なので割愛
SQL部分
SELECT test from ${ref("first_view")}
: このSQLクエリがDataformの肝と言えるような大事なものだと思っています(私見です)。
first_view
を参照しているのですが${ref("...")}
はDataformの機能で、別のデータセットやビューを参照する際に使用される特殊な構文です。
ref関数
を用いたクエリは、ref関数で指定したテーブル作成後に実行されます。
Dataformはsecond_view.sqlx
内でref関数
を用いて
first_view
を参照しているという依存関係を把握し、以下の実行順序でSQLXファイルを実行してくれます。
1.first_view.sqlx実行
2.second_view.sqlx実行
[COMPILED GRAPH]の画面からも視覚的に実行順序(依存関係)を見ることができます。
終わりに
Dataformを初めて動かしたのですがデータパイプラインが視覚化されること、ref関数を用いて実装するだけで依存関係が構築されることにとても感動しました。特に実装に難しいところもなく、手軽にデータパイプラインを構築できるのでBigQueryでのデータマート作成の際には選択肢の一つに加えて良いのではと思います。
この記事が誰かの役になったら嬉しいです。それでは。
参考
DataformにBigQueryへのアクセス権を付与する
Dataformリファレンス
Dataformチュートリアル